module.exports = {


  friendlyName: 'Replace placeholder host values',


  description: 'This script will update Host records to have the correct hardwareSerialNumber and uuid values.',
  extendedDescription: 'This script was designed to be run after the new columns have been added to the Host table, and all existing rows have had these column set to a placeholder value.',

  inputs: {
    dry: {
      description: 'Do a dry run instead of actually modifying the database?',
      type: 'boolean',
      defaultsTo: false
    },
  },

  fn: async function ({dry}) {

    let assert = require('assert');

    if (!sails.config.custom.fleetBaseUrl || !sails.config.custom.fleetApiToken) {
      throw new Error('sails.config.custom.fleetBaseUrl and sails.config.custom.fleetApiToken must both be provided.');
    }
    let fleetBaseUrl = sails.config.custom.fleetBaseUrl;
    let headers = {
      Authorization: `Bearer ${sails.config.custom.fleetApiToken}`
    };

    if (sails.config.custom.fleetApiOptionalCookie) {
      headers['Cookie'] = sails.config.custom.fleetApiOptionalCookie;
    }

    let page = 0;
    let HOSTS_PAGE_SIZE = 100;

    let hostRecordsToUpdate = [];

    await sails.helpers.flow.until(async()=>{
      let hosts;
      let byHostFleetApidsSeenInLatestFleetScan = {};
      {
        let responseData = await sails.helpers.http.get.with({
          url: '/api/v1/fleet/hosts',
          data: { page: page, per_page: HOSTS_PAGE_SIZE},//eslint-disable-line camelcase
          baseUrl: fleetBaseUrl,
          headers
        })
        .timeout(120000)
        .retry(['requestFailed', {name: 'TimeoutError'}]);
        assert(_.isArray(responseData.hosts));
        assert(responseData.hosts.every((host) => _.isNumber(host.id)));
        hosts = responseData.hosts;
      }//∫

      for (let host of hosts) {
        byHostFleetApidsSeenInLatestFleetScan[host.id] = {
          fleetApid: host.id,
          hardwareSerialNumber: host.hardware_serial !== '' ? host.hardware_serial : 'N/A',// Note: If a host does not have a hardware_serial value (e.g., ChromeOS hosts), this value will be set to 'N/A'.
          uuid: host.uuid,
        };//∞
      }

      let recognizedHosts = await Host.find({ fleetApid: { in: Object.keys(byHostFleetApidsSeenInLatestFleetScan).map((key)=>Number(key)) } });

      for (let $host of recognizedHosts){
        if( $host.uuid === '?' || $host.hardwareSerialNumber === '?') { // If you used something else for the placeholder value, modify this line
          hostRecordsToUpdate.push(byHostFleetApidsSeenInLatestFleetScan[$host.fleetApid]);
        }
      }

      if(hosts.length < HOSTS_PAGE_SIZE) {
        return true;
      }
    });

    if(dry) {
      sails.log(`Dry run: Would have updated ${hostRecordsToUpdate.length} host records with placeholder uuid and hardwareSerialNumber values.`);
    } else {
      for(let updatedHost of hostRecordsToUpdate){
        await Host.updateOne({fleetApid: updatedHost.fleetApid}).set({uuid: updatedHost.uuid, hardwareSerialNumber: updatedHost.hardwareSerialNumber});
      }
      sails.log(`Updated ${hostRecordsToUpdate.length} host records with real uuid and hardwareSerialNumber values.`);
    }



  }


};
